﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Windows.Forms;
using OrionApplication.OrionLib.Dao;
using OrionApplication.OrionLib.Orion;

namespace OrionApplication.OrionForm
{
    public partial class OrionBaseDoubleForm
        : OrionBaseForm,
          OrionApplication.OrionForm.Base.Interface.OrionBaseDoubleFormInterface
    {
        /// <summary>
        /// Nom de la colonne contenant l'état de l'enregistrement
        /// </summary>
        public String sNomColonneOrionEtat;
        /// <summary>
        /// Nom de la colonne contenant l'OrionId de l'enregistrement
        /// </summary>
        public String sNomColonneOrionId;
        /// <summary>
        /// Dao d'accès au données pour le type de la fenêtre en cours
        /// </summary>
        protected OrionApplication.OrionLib.Dao.Interface.DaoInterface dao;
        /// <summary>
        /// Nombre de ligne sélectionnée dans le DataGrid
        /// </summary>
        public Int32 NbLigneDgSelected { get { return this.kDgv.SelectedRows.Count; } }
        /// <summary>
        /// OrinId de l'élément sélectionné dans le formulaire
        /// </summary>
        public Int32 OrionIdGdvSelected { get { return Convert.ToInt32(kDgv.SelectedRows[0].Cells["OrionId"].Value); } }
        /// <summary>
        /// Permet de mettre tout le formulaire en lecture seule
        /// </summary>
        public Boolean IsReadOnly = false;
        /// <summary>
        /// Permet de mettre la parti GRID du formulaire en lecture seule
        /// </summary>
        public Boolean IsPanelTopReadOnly = false;
        /// <summary>
        /// Permet de mettre la parti basse du formulaire en lecture seule
        /// </summary>
        public Boolean IsPanelBottomReadOnly = false;
        /// <summary>
        /// Permet de mettre la parti basse du formulaire en lecture seule
        /// </summary>
        public Boolean IsPanelBottomHidden = false;
        /// <summary>
        /// Permet de mettre la parti basse du formulaire en lecture seule
        /// </summary>
        public Boolean IsPanelTopHidden = false;
        /// <summary>
        /// Permet de mettre le forumulaire dans différents modes
        /// </summary>
        public String Mode = string.Empty;
        /// <summary>
        /// Permet de préciser une requête pour en visualiser le résultat
        /// </summary>
        public String SQL = string.Empty;
        /// <summary>
        /// Indique au programme si les événements ont déjà étaient mis en place
        /// </summary>
        protected bool IsEvenFiredBaseDouble = false;

        /// <summary>
        /// Constructeur
        /// </summary>
        protected OrionBaseDoubleForm()
        {
            dao = new DaoBase();
            InitializeComponent();
            this.sNomColonneOrionEtat = "OrionEtat";
            this.sNomColonneOrionId = "OrionId";
        }

        /// <summary>
        /// Constructeur
        /// </summary>
        /// <param name="titre">S'affichera dans la barre de titre de la fenêtre</param>
        public OrionBaseDoubleForm(String titre)
            : base(titre)
        {
            InitializeComponent();
            this.sNomColonneOrionEtat = "OrionEtat";
            this.sNomColonneOrionId = "OrionId";
        }

        /// <summary>
        /// Constructeur
        /// </summary>
        /// <param name="titre">S'affichera dans la barre de titre de la fenêtre</param>
        public OrionBaseDoubleForm(String titre, String NomColonneEtat)
            : base(titre)
        {
            InitializeComponent();
            this.sNomColonneOrionEtat = NomColonneEtat;
            this.sNomColonneOrionId = "OrionId";
        }

        /// <summary>
        /// Constructeur
        /// </summary>
        /// <param name="titre">S'affichera dans la barre de titre de la fenêtre</param>
        public OrionBaseDoubleForm(String titre, String NomColonneEtat, String NomColonneOrionId)
            : base(titre)
        {
            InitializeComponent();
            this.sNomColonneOrionEtat = NomColonneEtat;
            this.sNomColonneOrionId = NomColonneOrionId;
        }

        /// <summary>
        /// Permet de sélectionner l'objet par son OrionId Unique
        /// </summary>
        /// <param name="OrionId">OrionId unique à sélectionner</param>
        public void FocusSur(Int32 OrionId)
        {
            // Nous bouclons sur toutes les lignes
            for (int i = 0; i < kDgv.Rows.Count; i++)
            {
                // Nous tombons sur le bon OrionId
                if (Convert.ToInt32(kDgv.Rows[i].Cells[this.sNomColonneOrionId].Value).Equals(OrionId))
                {
                    // Nous sélectionnons la bonne ligne
                    kDgv.Rows[i].Cells[1].Selected = true;
                    // Dès que nous le trouvons, nous arrêtons la boucle => Gain de temps
                    break;
                }
            }
        }

        /// <summary>
        /// Permet de savoir si une ligne est sélectionnée dans le DataGrid
        /// </summary>
        /// <returns>bool : True si une ligne est sélectionnée, False sinon</returns>
        public bool ExisteLigneSelectionnee()
        {
            if ( this.NbLigneDgSelected > 0)
                return true;
            return false;
        }

        /// <summary>
        /// Supprime l'enregistrement courant de la base de données
        /// </summary>
        public virtual void SupprimeEnregistrement()
        {
            // Si il existe une ligne sélectionnée
            if (this.ExisteLigneSelectionnee())
            {
                // Si l'utilisateur confirme son choix de suppression
                if (OrionOutils.ChoixOuiNon(OrionConfBase.ConfirmSuppression) == DialogResult.Yes)
                {
                    // Nous supprimons l'enregistrement
                    dao.Delete(Convert.ToInt32(kDgv.SelectedRows[0].Cells[this.sNomColonneOrionId].Value));
                    // Nous enlevons la ligne sélectionnée du DataGrid
                    // Nous ne rafraichissons pas pour une raison de temps de réponse
                    // => Avons-nous raison ??
                    kDgv.Rows.Remove(kDgv.SelectedRows[0]);
                }
            }
            else
            {
                // Nous prévenons l'utilisateur qu'aucune ligne est sélectionnée pour suppression
                OrionOutils.Alerte(OrionConfBase.AucuneLigneSelectionnee);
            }
        }

        /// <summary>
        /// Permet de permuter l'OrionEtat d'un Enregistrement
        /// </summary>
        public void UpdateOrionEtat()
        {
            // Si une ligne est sélectionnée
            if (this.ExisteLigneSelectionnee())
            {
                // Nous mettons à jour l'état de l'enregistrement
                this.dao.UpdateOrionEtat(Convert.ToInt32(kDgv.SelectedRows[0].Cells[this.sNomColonneOrionId].Value), !Convert.ToBoolean(kDgv.SelectedRows[0].Cells[this.sNomColonneOrionEtat].Value));
                // Nous rafraichisson le DataGrid ???
                // Quid du temps de réponse ???
                // Devons nous mettre à jour le DataGrid directement ?
                //this.RempliKDgv();
                // Puisque nous rafraichisson le DataGrid, nous devons "pointer" sur la bonne ligne
                //this.FocusSur(Convert.ToInt32(kDgv.SelectedRows[0].Cells["OrionId"].Value));
                kDgv.SelectedRows[0].Cells[this.sNomColonneOrionEtat].Value = !Convert.ToBoolean(kDgv.SelectedRows[0].Cells[this.sNomColonneOrionEtat].Value);
            }
            else
            {
                // Nous prévenons l'utilisateur qu'aucune ligne est sélectionnée pour MAJ
                OrionOutils.Alerte(OrionConfBase.AucuneLigneSelectionnee);
            }
        }

        #region EtatBouton
        /// <summary>
        /// Permet d'activer ou non un Bouton de la barre de menu
        /// </summary>
        /// <param name="F1">True sera actif, False sera inactif</param>
        /// <param name="F2">True sera actif, False sera inactif</param>
        /// <param name="F3">True sera actif, False sera inactif</param>
        /// <param name="F4">True sera actif, False sera inactif</param>
        /// <param name="F5">True sera actif, False sera inactif</param>
        /// <param name="F6">True sera actif, False sera inactif</param>
        /// <param name="F7">True sera actif, False sera inactif</param>
        /// <param name="F8">True sera actif, False sera inactif</param>
        /// <param name="F9">True sera actif, False sera inactif</param>
        /// <param name="F10">True sera actif, False sera inactif</param>
        /// <param name="F11">True sera actif, False sera inactif</param>
        /// <param name="F12">True sera actif, False sera inactif</param>
        public void EtatBouton(bool F1, bool F2, bool F3, bool F4, bool F5, bool F6,
            bool F7, bool F8, bool F9, bool F10, bool F11, bool F12)
        {
            this.kBtn1.Enabled = F1;
            this.kBtn2.Enabled = F2;
            this.kBtn3.Enabled = F3;
            this.kBtn4.Enabled = F4;
            this.kBtn5.Enabled = F5;
            this.kBtn6.Enabled = F6;
            this.kBtn7.Enabled = F7;
            this.kBtn8.Enabled = F8;
            this.kBtn9.Enabled = F9;
            this.kBtn10.Enabled = F10;
            this.kBtn11.Enabled = F11;
            this.kBtn12.Enabled = F12;
        }

        /// <summary>
        /// Permet d'activer ou non un Bouton de la barre de menu
        /// </summary>
        /// <param name="F1"><= 0 sera inactif, 0 > sera actif</param>
        /// <param name="F2"><= 0 sera inactif, 0 > sera actif</param>
        /// <param name="F3"><= 0 sera inactif, 0 > sera actif</param>
        /// <param name="F4"><= 0 sera inactif, 0 > sera actif</param>
        /// <param name="F5"><= 0 sera inactif, 0 > sera actif</param>
        /// <param name="F6"><= 0 sera inactif, 0 > sera actif</param>
        /// <param name="F7"><= 0 sera inactif, 0 > sera actif</param>
        /// <param name="F8"><= 0 sera inactif, 0 > sera actif</param>
        /// <param name="F9"><= 0 sera inactif, 0 > sera actif</param>
        /// <param name="F10"><= 0 sera inactif, 0 > sera actif</param>
        /// <param name="F11"><= 0 sera inactif, 0 > sera actif</param>
        /// <param name="F12"><= 0 sera inactif, 0 > sera actif</param>
        public void EtatBouton(int F1, int F2, int F3, int F4, int F5, int F6,
            int F7, int F8, int F9, int F10, int F11, int F12)
        {
            this.kBtn1.Enabled = Convert.ToBoolean(F1);
            this.kBtn2.Enabled = Convert.ToBoolean(F2);
            this.kBtn3.Enabled = Convert.ToBoolean(F3);
            this.kBtn4.Enabled = Convert.ToBoolean(F4);
            this.kBtn5.Enabled = Convert.ToBoolean(F5);
            this.kBtn6.Enabled = Convert.ToBoolean(F6);
            this.kBtn7.Enabled = Convert.ToBoolean(F7);
            this.kBtn8.Enabled = Convert.ToBoolean(F8);
            this.kBtn9.Enabled = Convert.ToBoolean(F9);
            this.kBtn10.Enabled = Convert.ToBoolean(F10);
            this.kBtn11.Enabled = Convert.ToBoolean(F11);
            this.kBtn12.Enabled = Convert.ToBoolean(F12);
        }

        /// <summary>
        /// Permet d'activer ou non un Bouton de la barre de menu
        /// </summary>
        /// <param name="F1"><= 0 sera inactif, 0 > sera actif</param>
        /// <param name="F2"><= 0 sera inactif, 0 > sera actif</param>
        /// <param name="F3"><= 0 sera inactif, 0 > sera actif</param>
        /// <param name="F4"><= 0 sera inactif, 0 > sera actif</param>
        /// <param name="F5"><= 0 sera inactif, 0 > sera actif</param>
        /// <param name="F6"><= 0 sera inactif, 0 > sera actif</param>
        /// <param name="F7"><= 0 sera inactif, 0 > sera actif</param>
        /// <param name="F8"><= 0 sera inactif, 0 > sera actif</param>
        /// <param name="F9"><= 0 sera inactif, 0 > sera actif</param>
        /// <param name="F10"><= 0 sera inactif, 0 > sera actif</param>
        /// <param name="F11"><= 0 sera inactif, 0 > sera actif</param>
        /// <param name="F12"><= 0 sera inactif, 0 > sera actif</param>
        public void EtatBouton(string F1, string F2, string F3, string F4, string F5, string F6,
            string F7, string F8, string F9, string F10, string F11, string F12)
        {
            this.EtatBouton(Convert.ToInt32(F1),
                Convert.ToInt32(F2),
                Convert.ToInt32(F3),
                Convert.ToInt32(F4),
                Convert.ToInt32(F5),
                Convert.ToInt32(F6),
                Convert.ToInt32(F7),
                Convert.ToInt32(F8),
                Convert.ToInt32(F9),
                Convert.ToInt32(F10),
                Convert.ToInt32(F11),
                Convert.ToInt32(F12));
        }
        #endregion

        /// <summary>
        /// Permet de remplir le grid avec le DAO en cours
        /// </summary>
        public virtual void RempliKDgv()
        {
            if (this.Mode.ToUpper().Equals(OrionConfBase.ModeFormRequeteSQL))
            {
                dao = new DaoBase();
                DataSet ds = dao.SelectFromRequete(this.SQL);
                if (ds.Tables.Count > 0)
                {
                    kDgv.DataSource = ds.Tables[0];
                    this.EtatBouton(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);

                }
            }
            else
            {
                DataSet ds = dao.SelectAllDSView();
                if (ds.Tables.Count > 0)
                {
                    kDgv.DataSource = ds.Tables[0];
                    kDgv.Columns[this.sNomColonneOrionId].Visible = false;
                }
            }
        }

        #region Gestion des Boutons d'Action
        private void OrionFormBase_KeyDown(object sender, KeyEventArgs e)
        {
            // Gestion des boutons d'action
            switch (e.KeyCode)
            {
                case Keys.F1: if (kBtn1.Enabled) { LanceActionF1(kBtn1); } break;
                case Keys.F2: if (kBtn2.Enabled) { LanceActionF2(kBtn2); } break;
                case Keys.F3: if (kBtn3.Enabled) { LanceActionF3(kBtn3); } break;
                case Keys.F4: if (kBtn4.Enabled) { LanceActionF4(kBtn4); } break;
                case Keys.F5: if (kBtn5.Enabled) { LanceActionF5(kBtn5); } break;
                case Keys.F6: if (kBtn6.Enabled) { LanceActionF6(kBtn6); } break;
                case Keys.F7: if (kBtn7.Enabled) { LanceActionF7(kBtn7); } break;
                case Keys.F8: if (kBtn8.Enabled) { LanceActionF8(kBtn8); } break;
                case Keys.F9: if (kBtn9.Enabled) { LanceActionF9(kBtn9); } break;
                case Keys.F10: if (kBtn10.Enabled) { LanceActionF10(kBtn10); } break;
                case Keys.F11: if (kBtn11.Enabled) { LanceActionF11(kBtn11); } break;
                case Keys.F12: if (kBtn12.Enabled) { LanceActionF12(kBtn12); } break;
                default: break;
            }
        }

        /// <summary>
        /// Réalise les actions par la touche F1
        /// </summary>
        protected virtual void LanceActionF1(object sender)
        {
            this.ParseLanceAction((Control)sender, "ONCLICK");
        }

        /// <summary>
        /// Réalise les actions par la touche F2
        /// </summary>
        protected virtual void LanceActionF2(object sender)
        {
            this.ParseLanceAction((Control)sender, "ONCLICK");
        }

        /// <summary>
        /// Réalise les actions par la touche F3
        /// </summary>
        protected virtual void LanceActionF3(object sender)
        {
            this.ParseLanceAction((Control)sender, "ONCLICK");
        }

        /// <summary>
        /// Réalise les actions par la touche F4
        /// </summary>
        protected virtual void LanceActionF4(object sender)
        {
            this.ParseLanceAction((Control)sender, "ONCLICK");
        }

        /// <summary>
        /// Réalise les actions par la touche F5
        /// </summary>
        protected virtual void LanceActionF5(object sender)
        {
            this.ParseLanceAction((Control)sender, "ONCLICK");
        }

        /// <summary>
        /// Réalise les actions par la touche F6
        /// </summary>
        protected virtual void LanceActionF6(object sender)
        {
            this.ParseLanceAction((Control)sender, "ONCLICK");
        }

        /// <summary>
        /// Réalise les actions par la touche F7
        /// </summary>
        protected virtual void LanceActionF7(object sender)
        {
            this.ParseLanceAction((Control)sender, "ONCLICK");
        }

        /// <summary>
        /// Réalise les actions par la touche F8
        /// </summary>
        protected virtual void LanceActionF8(object sender)
        {
            this.ParseLanceAction((Control)sender, "ONCLICK");
        }

        /// <summary>
        /// Réalise les actions par la touche F9
        /// </summary>
        protected virtual void LanceActionF9(object sender)
        {
            this.ParseLanceAction((Control)sender, "ONCLICK");
        }

        /// <summary>
        /// Réalise les actions par la touche F10
        /// </summary>
        protected virtual void LanceActionF10(object sender)
        {
            this.ParseLanceAction((Control)sender, "ONCLICK");
        }

        /// <summary>
        /// Réalise les actions par la touche F11
        /// </summary>
        protected virtual void LanceActionF11(object sender)
        {
            this.ParseLanceAction((Control)sender, "ONCLICK");
        }

        /// <summary>
        /// Réalise les actions par la touche F12
        /// </summary>
        protected virtual void LanceActionF12(object sender)
        {
            this.ParseLanceAction((Control)sender, "ONCLICK");
        }
        #endregion

        /// <summary>
        /// Permet de montrer le formulaire en précisant le titre de la fenêtre
        /// </summary>
        /// <param name="titre">Titre de la fenêtre</param>
        public void Show(String titre)
        {
            this.Text = titre;
            base.Show();
        }

        /// <summary>
        /// Permet d'ouvrir la form OrionTable avec un identifiant spécifique
        /// </summary>
        /// <param name="Ident">Identifiant à afficher dans le formulaire</param>
        /// <param name="Titre">Titre de la fenêtre</param>
        protected void GoToOrionTable(String Ident, String Titre)
        {
            OrionTableForm otf = new OrionTableForm(Titre);
            otf.IdentA = Ident;
            otf.SetMdiParent(this.MdiParent);
            otf.Show(Titre);
        }

        private void OrionFormBase_Load(object sender, EventArgs e)
        {
            this.Text = this.Titre;
            this.RempliKDgv();
        }

        private void OrionBaseForm_Activated(object sender, EventArgs e)
        {
            if (!this.IsEvenFiredBaseDouble)
            {
                this.IsEvenFiredBaseDouble = true;
                if (this.IsPanelTopHidden)
                    this.kryptonSplitContainer1.Panel1Collapsed = true;
                if (this.IsPanelBottomHidden)
                    this.kryptonSplitContainer1.Panel2Collapsed = true;
                if (this.IsReadOnly)
                {
                    this.kryptonSplitContainer1.Panel1.Enabled = false;
                    this.kryptonSplitContainer1.Panel2.Enabled = false;
                }
                else
                {
                    if (this.IsPanelTopReadOnly)
                        this.kryptonSplitContainer1.Panel1.Enabled = false;
                    if(this.IsPanelBottomReadOnly)
                        this.kryptonSplitContainer1.Panel2.Enabled = false;
                }
            }
        }

        #region Gestion du redimenssionnement largeur colonne
        private void largeurFenêtreToolStripMenuItem_Click(object sender, EventArgs e)
        {
            kDgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
        }

        private void largeurEntêteToolStripMenuItem_Click(object sender, EventArgs e)
        {
            kDgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.ColumnHeader;
        }

        private void largeurContenuToolStripMenuItem_Click(object sender, EventArgs e)
        {
            kDgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;
        }
        #endregion

        #region Gestion de l'export Excel
        private void excelToolStripMenuItem_Click(object sender, EventArgs e)
        {
            OrionOutils.Export2Excel(kDgv, true);
        }

        private void excelSansEntêtesToolStripMenuItem_Click(object sender, EventArgs e)
        {
            OrionOutils.Export2Excel(kDgv, false);
        }
        #endregion
    }
}